/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logistica.beans;

import entities.Almacen;
import entities.LineaInventarioAlmacen;
import entities.LocalizacionAlmacenProductoTalla;
import entities.Producto;
import entities.ProductoTalla;
import facades.LineaFacturaPedidoFabricaFacade;
import facades.LineaInventarioAlmacenFacade;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.enterprise.event.Event;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.New;
import javax.inject.Inject;
import productos.datamodel.FiltroProductos;
import qualifiers.EventoEntidadEditada;
import qualifiers.EventoEntidadElegida;
import qualifiers.EventoPreEditarEntidad;

/**
 *
 * @author damfercer
 */
@Named(value = "inventarioAlmacenBean")
@SessionScoped
public class InventarioAlmacenBean implements Serializable {
    @Inject
    LineaInventarioAlmacenFacade lineaInventarioAlmacenFacade;
    @Inject
    LineaFacturaPedidoFabricaFacade lineaFacturaPedidoFabricaFacade;
    private Almacen almacen;
    @Inject
    @EventoPreEditarEntidad
    Event<LineaInventarioAlmacen> eventoPreEditarLineaInventario;
    @Inject
    @EventoEntidadEditada
    Event<LineaInventarioAlmacen> eventoLineaInventarioEditado;
    @Inject @New
    private FiltroProductos filtroProductos;
    private List<LineaInventarioAlmacen> lineasAdd;
    @Inject
    private Event<Almacen> eventoAlmacenEditado;
    /**
     * Creates a new instance of InventarioAlmacenBean
     */
    @PostConstruct
    public void init(){
        filtroProductos.init();
        lineasAdd=new ArrayList<LineaInventarioAlmacen>();
    }
    
    public void filtrar(){
        for(Producto p : filtroProductos.filtrar()){
            for(ProductoTalla pt: p.getProductoTallaList()){
                LineaInventarioAlmacen linea=new LineaInventarioAlmacen();
                linea.setAlmacen(almacen);
                linea.setProductoTalla(pt);
                linea.setCantidad(0);
                lineasAdd.add(linea);
            }
        }
        try{
            Collections.sort(lineasAdd);
        }
        catch(IllegalStateException e){
        }
    }
    
    public void guardar(){
        for(LineaInventarioAlmacen linea: lineasAdd){
            if(linea.getCantidad()!=0){
                lineaInventarioAlmacenFacade.create(linea);
                almacen.getLineaInventarioAlmacenList().add(linea);
            }
        }
        eventoAlmacenEditado.fire(almacen);
    }
    /*public void onNuevaLineaFactura(@Observes @EventoEntidadCreada LineaFacturaPedidoFabrica nuevaLineaFacturaPedidoFabrica){
        LineaInventarioAlmacen lineaInventarioAlmacen=lineaInventarioAlmacenFacade.getLineaInventarioDeAlmacen(nuevaLineaFacturaPedidoFabrica.getFacturaPedidoFabrica().getAlmacen(), nuevaLineaFacturaPedidoFabrica.getProductoTalla());
        if(lineaInventarioAlmacen==null){
            lineaInventarioAlmacen=new LineaInventarioAlmacen();
            lineaInventarioAlmacen.setAlmacen(nuevaLineaFacturaPedidoFabrica.getFacturaPedidoFabrica().getAlmacen());
            lineaInventarioAlmacen.setCantidad(nuevaLineaFacturaPedidoFabrica.getCantidad());
            lineaInventarioAlmacen.setProductoTalla(nuevaLineaFacturaPedidoFabrica.getProductoTalla());
            lineaInventarioAlmacenFacade.create(lineaInventarioAlmacen);
            if(lineaInventarioAlmacen.getAlmacen().getLineaInventarioAlmacenList()==null){
                lineaInventarioAlmacen.getAlmacen().setLineaInventarioAlmacenList(new ArrayList<LineaInventarioAlmacen>());
            }
            lineaInventarioAlmacen.getAlmacen().getLineaInventarioAlmacenList().add(lineaInventarioAlmacen);
        }
        else{
            lineaInventarioAlmacen.setCantidad(lineaInventarioAlmacen.getCantidad()+nuevaLineaFacturaPedidoFabrica.getCantidad());
            lineaInventarioAlmacenFacade.edit(lineaInventarioAlmacen);
        }
    }
    
    public void onLineaRecepcionPedidoFabricaPreEditado(@Observes @EventoPreEditarEntidad LineaFacturaPedidoFabrica lineaFacturaPedidoFabrica){
        if(lineaFacturaPedidoFabrica.getIdLineaFacturaPedidoFabrica()!=null){
            LineaFacturaPedidoFabrica lineaFactura=lineaFacturaPedidoFabricaFacade.find(lineaFacturaPedidoFabrica.getIdLineaFacturaPedidoFabrica());
            if(lineaFactura.getCantidad()!=lineaFacturaPedidoFabrica.getCantidad()){
                int diferenciaCantidad=lineaFacturaPedidoFabrica.getCantidad()-lineaFactura.getCantidad();
                LineaInventarioAlmacen lineaInventario=lineaInventarioAlmacenFacade.getLineaInventarioDeAlmacen(lineaFacturaPedidoFabrica.getFacturaPedidoFabrica().getAlmacen(), lineaFacturaPedidoFabrica.getProductoTalla());
                lineaInventario.setCantidad(lineaInventario.getCantidad()+diferenciaCantidad);
                lineaInventarioAlmacenFacade.edit(lineaInventario);
            }
        }
    }*/
    
    public void onAlmacenElegido(@Observes @EventoEntidadElegida Almacen almacen){
        this.almacen=almacen;
        filtroProductos.init();
        lineasAdd=new ArrayList<LineaInventarioAlmacen>();
        Collections.sort(this.almacen.getLineaInventarioAlmacenList());
    }  
    
    public Almacen getAlmacen() {
        return almacen;
    }

    /**
     * @param almacen the almacen to set
     */
    public void setAlmacen(Almacen almacen) {
        this.almacen = almacen;
    }
    
    public LocalizacionAlmacenProductoTalla recuperarLocalizacionDeLineaDeInventario(LineaInventarioAlmacen lineaInventario){
        LocalizacionAlmacenProductoTalla localizacion=null;
        if(lineaInventario!=null && lineaInventario.getProductoTalla()!=null && lineaInventario.getProductoTalla().getLineaEnvioTraspasoMercanciaList()!=null){
          for (LocalizacionAlmacenProductoTalla loc : lineaInventario.getProductoTalla().getLocalizacionAlmacenProductoTallaList()) {
            if(loc.getTipoLocalizacionAlmacen().getAlmacen().equals(lineaInventario.getAlmacen())){
                localizacion=loc;
                break;
            }
            }  
        }
        
        return localizacion;
    }
    
    
    public void onChange(LineaInventarioAlmacen linea){
        eventoPreEditarLineaInventario.fire(linea);
        lineaInventarioAlmacenFacade.edit(linea);
        eventoLineaInventarioEditado.fire(linea);
    }

    /**
     * @return the lineasAdd
     */
    public List<LineaInventarioAlmacen> getLineasAdd() {
        return lineasAdd;
    }

    /**
     * @param lineasAdd the lineasAdd to set
     */
    public void setLineasAdd(List<LineaInventarioAlmacen> lineasAdd) {
        this.lineasAdd = lineasAdd;
    }

    /**
     * @return the filtroProductos
     */
    public FiltroProductos getFiltroProductos() {
        return filtroProductos;
    }

    /**
     * @param filtroProductos the filtroProductos to set
     */
    public void setFiltroProductos(FiltroProductos filtroProductos) {
        this.filtroProductos = filtroProductos;
    }
}
